package container

import (
	"sync"
)

type SyncMap[k any, v any] sync.Map

// 创建 sync.Map
func NewSyncMap[k any, v any]() SyncMap[k, v] {
	return SyncMap[k, v]{}
}

// 设置 sync.Map
func (m *SyncMap[k, v]) Add(key k, value v) {
	(*sync.Map)(m).Store(key, value)
}

// 获取 sync.Map
func (m *SyncMap[k, v]) Get(key k) (v, bool) {
	value, ok := (*sync.Map)(m).Load(key)
	if !ok {
		var a v //指定一个默认值,否则返回报错
		return a, false
	}
	return value.(v), true
}

// 删除 sync.Map
func (m *SyncMap[k, v]) Delete(key k) {
	(*sync.Map)(m).Delete(key)
}

// 遍历 sync.Map
func (m *SyncMap[k, v]) Range(f func(key k, value v) bool) {
	(*sync.Map)(m).Range(func(key, value interface{}) bool {
		return f(key.(k), value.(v))
	})
}

// 获取 sync.Map 长度
func (m *SyncMap[k, v]) Len() int {
	l := 0
	m.Range(func(key k, value v) bool {
		l++
		return true
	})
	return l
}

// 清空 sync.Map
func (m *SyncMap[k, v]) Clear() {
	*m = SyncMap[k, v]{}
}

// 判断 sync.Map 是否存在 key
func (m *SyncMap[k, v]) IsExist(key k) bool {
	_, ok := m.Get(key)
	return ok
}

// 判断 sync.Map 是否为空
func (m *SyncMap[k, v]) IsEmpty() bool {
	return m.Len() == 0
}

// 获取 sync.Map 所有 key
func (m *SyncMap[k, v]) Keys() []k {
	keys := make([]k, 0, m.Len())
	m.Range(func(key k, value v) bool {
		keys = append(keys, key)
		return true
	})
	return keys
}

// 获取 sync.Map 所有 value
func (m *SyncMap[k, v]) Values() []v {
	values := make([]v, 0, m.Len())
	m.Range(func(key k, value v) bool {
		values = append(values, value)
		return true
	})
	return values
}

// 将map合并到sync.Map
func (m *SyncMap[K, V]) MergeMap(mapData map[any]V) {
	for k, v := range mapData {
		m.Add(k.(K), v)
	}
}
